/**
 *	@file	d_iwa.c
 *	@brief	岩澤デバッグ用ソース フィールド非常駐オーバーレイ
 *	@author	Miyuki Iwasawa
 *	@date	04.12.04
 * */

#ifdef PM_DEBUG

#include "common.h"
#include "fld_bmp.h"
#include "fld_debug.h"
#include "fntsys.h"
#include "talk_msg.h"
#include "system/bmp_list.h"
#include "system/bmp_menu.h"
#include "system/brightness.h"
#include "system/fontproc.h"
#include "system/wipe.h"
#include "system/snd_tool.h"
#include "gflib/strbuf.h"
#include "gflib/strbuf_family.h"
#include "field/fieldsys.h"
#include "field/field.h"
#include "field/ev_mapchange.h"
#include "field/fieldmap.h"
#include "field/zonedata.h"
#include "field/field_event.h"
#include "field/field_matrix.h"
//#include "field/fld_mailbox.h"
#include "field/b_tower_ev.h"
#include "field/field_picture.h"
#include "field/field_demo.h"
#include "fielddata/maptable/zone_id.h"
#include "application/pokegear.h"
#include "field/fld_pgear.h"
#include "field/fld_cb.h"
#include "application/mailtool.h"
#include "application/an_puzzle.h"
#include "application/bong_case.h"
#include "application/slot.h"
#include "script.h"
#include "msgdata/msg.naix"
#include "msgdata/msg_debug_miyuki.h"
#include "savedata/guinness.h"
#include "savedata/pgear_sv_util.h"
#include "savedata/picture_util.h"
#include "savedata/bonguri.h"
#include "savedata/custom_ball.h"
#include "savedata/tr_house.h"
#include "src/demo/egg/egg.h"
#include "safari/safari_sys.h"

#include "d_iwa.h"

typedef struct _D_SAF_PARAM{
	MSGDATA_MANAGER *man;
	WORDSET* wset;		//ワーク
	STRBUF	*str;		//汎用
	STRBUF	*s_tmp;		//汎用
	SAFARI_LAYOUT* pl;
}D_SAF_PARAM;

#define WORDSET_DIWA_BUFNUM	(16)
#define WORDSET_DIWA_BUFLEN	(64)

extern void FieldBitMapWinCgxSet( GF_BGL_INI * ini );
extern void DebugWifiBTower_DummyDataMake(SAVEDATA* sv);

#define DW0_CGX	(1)
#define DW0_SX	(16)
#define DW0_SY	(14)
#define DW0_CGXNUM	(DW0_SX*DW0_SY)
#define DW0_PAL	(FLD_SYSFONT_PAL)

#define DW1_CGX	(1)
#define DW1_SX	(30)
#define DW1_SY	(24)
#define DW1_CGXNUM	(DW0_SX*DW0_SY)
#define DW1_PAL	(FLD_SYSFONT_PAL)
static const BMPWIN_DAT d_miyuki_BmpDat[] = {
 {GF_BGL_FRAME3_M,  1,  1, DW0_SX, DW0_SY, DW0_PAL, DW0_CGX },
 {GF_BGL_FRAME3_M,  1,  0, DW1_SX, DW1_SY, DW1_PAL, DW1_CGX },
 { 0xFF, 0, 0, 0, 0, 0, 0 },
};

static void DebugMenuExit(TCB_PTR tcb,void* work);
//tmap
static void DebugSub_PGearNormalInit(void* work);
static void DebugSub_PGearTelInit(void* work);
static void DebugSub_TMapJumpInit(void* work);
static void DebugSub_TMapBGInit(void* work);

static void DebugSub_SafariLayout(void* work);
static void DebugSub_SafariObjLayout(void* work);
static void DebugSub_SafariParamViewer(TCB_PTR tcb,void* work,u8 mode);

static void DebugSub_TelBookSet(void* work,int mode);

static void DebugSub_IClipNrm(void* work);
static void DebugSub_IClip1st(void* work);

static void DebugSub_FNote(void* work);
static void DebugSub_WifiNote(void* work);
static void DebugSub_Record(void* work);
static void DebugSub_NPlanter(void* work);

static void DebugSub_BongCaseNormal(void* work);
static void DebugSub_BongCasePot(void* work);
static void DebugSub_BongCasePot1st(void* work);
static void DebugSub_BongCaseBall(void* work);
static void DebugSub_BonguriMax(void* work);
static void DebugSub_BonguriNull(void* work);

static void DebugSub_AnPuzzleLv01(void* work);
static void DebugSub_AnPuzzleLv02(void* work);
static void DebugSub_AnPuzzleLv03(void* work);
static void DebugSub_AnPuzzleLv04(void* work);
static void DebugSub_AnNote(void* work);

static void DebugSub_SlotHard0(void* work);
static void DebugSub_SlotHard1(void* work);
static void DebugSub_SlotHard2(void* work);
static void DebugSub_SlotHard3(void* work);

static void DebugSub_Capsule(void* work,int code);
static void DebugSub_EggDemo(void* work,int code);

static void DebugSub_PictureSet(void* work,int mode);

static void SafariParamViewer(TCB_PTR tcb,void* work);

//------------------------------------------------------------------
///	メニューリストデータ
//------------------------------------------------------------------
typedef struct{
	u32	str_id;
	u32	param;
}MENU_PARAM;

enum{
 MENU_EXIT = 1,
 MENU_TBOOK_ADD,
 MENU_TBOOK_ADDALL,
 MENU_TBOOK_ADEL,
 MENU_TBOOK_TEST,
 MENU_PIC_ADD,
 MENU_PIC_FULL,
 MENU_PIC_ALLDEL,
 MENU_TOUDAI_DEMO,
 MENU_TOWER_RNDSEED,
 MENU_TOWER_FCLEAR,
 MENU_TOWER_GUINNESS,
 MENU_TOWER_WIFIDAT,
 MENU_TOWER_BPGET1,
 MENU_TOWER_BPGET2,
 MENU_PG_APP0,
 MENU_PG_APP1,
 MENU_PG_APP2,
 MENU_PG_MLV0,
 MENU_PG_MLV1,
 MENU_PG_MLV2,
 MENU_CAPSULE_PC,
 MENU_CAPSULE_FULL,
 MENU_CAPSULE_A_LITTLE,
 MENU_CAPSULE_CLEAR,
 MENU_EGG_DEMO_N,
 MENU_EGG_DEMO_M,
 MENU_SAFARI_PARAM_M,
 MENU_SAFARI_PARAM_F,
 MENU_JUICE_NULL,
 MENU_CJUICE_NULL,
 MENU_TRHOUSE_CLEAR,
};

static const MENU_PARAM MiyukiMenuList[] = {
	//ラベル　スロット
	{ msg_label_slot,	BMPLIST_RABEL},
	{ msg_slot01,	(u32)DebugSub_SlotHard0},	//スロット
	{ msg_slot02,	(u32)DebugSub_SlotHard1},	//スロット
	{ msg_slot03,	(u32)DebugSub_SlotHard2},	//スロット
	{ msg_slot04,	(u32)DebugSub_SlotHard3},	//スロット

	//ラベル　ポケギア
	{ msg_label_tmap,	BMPLIST_RABEL},
	{ msg_dtmapN,		(u32)DebugSub_PGearNormalInit},	//ポケギア
	{ msg_dtmapJ,		(u32)DebugSub_TMapJumpInit},	//空を飛ぶ
	{ msg_dtmapB,		(u32)DebugSub_TMapBGInit},		//BGモード
	{ msg_dtmapT,		(u32)DebugSub_PGearTelInit},	//ポケギア　電話着信モード
	{ msg_pg_app0,		MENU_PG_APP0},		//ポケギア　初期状態
	{ msg_pg_app1,		MENU_PG_APP1},		//ポケギア　マップオープン
	{ msg_pg_app2,		MENU_PG_APP2},		//ポケギア　ラジオオープン
	{ msg_map_lv0,		MENU_PG_MLV0},		//ポケギア マップレベル0
	{ msg_map_lv1,		MENU_PG_MLV1},		//ポケギア マップレベル1
	{ msg_map_lv2,		MENU_PG_MLV2},		//ポケギア マップレベル2

	//ラベル　サファリ
	{ msg_label_safari,	BMPLIST_RABEL},
	{ msg_safari_l,		(u32)DebugSub_SafariLayout},		//サファリ
	{ msg_safari_o,		(u32)DebugSub_SafariObjLayout},		//サファリ
	{ msg_safari_mine,	MENU_SAFARI_PARAM_M },		//サファリパラメータ自分
	{ msg_safari_friend,MENU_SAFARI_PARAM_F },		//サファリパラメータ友だち

	//ラベル　でんわちょう
	{ msg_label_tbook,	BMPLIST_RABEL},
	{ msg_tbook_add,	MENU_TBOOK_ADD},	//電話帳足す
	{ msg_tbook_alladd,	MENU_TBOOK_ADDALL},	//電話帳全部足す
	{ msg_tbook_alldel,	MENU_TBOOK_ADEL},	//電話帳全部消す
	{ msg_tbook_test,	MENU_TBOOK_TEST},	//電話予約テスト
	{ msg_pic_add,		MENU_PIC_ADD},		//写真追加
	{ msg_pic_full,		MENU_PIC_FULL},	//写真追加
	{ msg_pic_alldel,	MENU_PIC_ALLDEL},	//写真全部消す

	//ラベル　アプリ
	{ msg_label_app,	BMPLIST_RABEL},
	{ msg_fnote,		(u32)DebugSub_FNote},	//冒険ノート
	{ msg_wnote,		(u32)DebugSub_WifiNote},	//Wifiノート
	{ msg_record,		(u32)DebugSub_Record},	//レコードコーナー
	{ msg_planter,		(u32)DebugSub_NPlanter},	//木の実プランター

	//ラベル ぼんぐり
	{ msg_label_bonguri,BMPLIST_RABEL},
	{ msg_bcase_normal,	(u32)DebugSub_BongCaseNormal},	//ぼんぐりケース　ノーマル
	{ msg_bcase_pot,	(u32)DebugSub_BongCasePot},	//ぼんぐりケース　ポット
	{ msg_bcase_pot_i,	(u32)DebugSub_BongCasePot1st},	//ぼんぐりケース　ポット初回
	{ msg_bcase_ball,	(u32)DebugSub_BongCaseBall},	//ぼんぐりケース　ボール
	{ msg_bongjuice_null,	MENU_JUICE_NULL},	//ジュースデータクリア
	{ msg_commjuice_null,	MENU_CJUICE_NULL},	//通信ジュースデータオールクリア

	//ラベル　アンノーン
	{ msg_label_annoon,	BMPLIST_RABEL},
	{ msg_an_puzzle01,	(u32)DebugSub_AnPuzzleLv01},	//アンノーンパズル
	{ msg_an_puzzle02,	(u32)DebugSub_AnPuzzleLv02},	//アンノーンパズル
	{ msg_an_puzzle03,	(u32)DebugSub_AnPuzzleLv03},	//アンノーンパズル
	{ msg_an_puzzle04,	(u32)DebugSub_AnPuzzleLv04},	//アンノーンパズル
	{ msg_an_note,		(u32)DebugSub_AnNote},			//アンノーンノート

	//ラベル　イメージクリップ
	{ msg_label_iclip,	BMPLIST_RABEL},
	{ msg_iclip_00,		(u32)DebugSub_IClipNrm},	//クリップ初回説明ナシ
	{ msg_iclip_01,		(u32)DebugSub_IClip1st},	//クリップ初回説明アリ
	{ msg_cball_pc,		MENU_CAPSULE_PC},	//カプセルPC
	{ msg_cball_full,	MENU_CAPSULE_FULL},	//カプセル
	{ msg_cball_a_little,MENU_CAPSULE_A_LITTLE},	//カプセルすこし
	{ msg_cball_clear,	MENU_CAPSULE_CLEAR},	//カプセルクリア

	//ラベル　そのた
	{ msg_label_else,		BMPLIST_RABEL},
	{ msg_trhouse_clear,	MENU_TRHOUSE_CLEAR},	//トレーナーハウス全クリア

	//ラベル　デモ
	{ msg_label_demo,	BMPLIST_RABEL},
	{ msg_egg_demo01,	MENU_EGG_DEMO_N},	//たまごうまれデモ
	{ msg_egg_demo02,	MENU_EGG_DEMO_M},		//たまごうまれデモ マナフィ
	{ msg_toudai_demo,	MENU_TOUDAI_DEMO},	//灯台デモ再生

	//ラベル　タワー
	{ msg_label_script,			BMPLIST_RABEL},
	{ msg_tower_rndseed,		MENU_TOWER_RNDSEED},	//タワーランダムのたねいきなり同期
	{ msg_tower_roomf_clear,	MENU_TOWER_FCLEAR},		//タワーWifiルームフラグクリア
	{ msg_tower_guinness,		MENU_TOWER_GUINNESS},	//タワー ギネスホールデータをダミーで埋める
	{ msg_tower_wifidata,		MENU_TOWER_WIFIDAT},	//タワー wifiダミーアップデートデータ作成
	{ msg_tower_bpget,			MENU_TOWER_BPGET1},		//タワー 500BPゲット
	{ msg_tower_bpget2,			MENU_TOWER_BPGET2},		//タワー 9998BPゲット


	//とじる
	{ msg_exit,			MENU_EXIT},		//閉じる
	{ msg_label_end,	BMPLIST_RABEL},	//ラベル02
};

#define BLIST_NUM	NELEMS(MiyukiMenuList)

///	リストシステムからのコールバック※一行表示ごと
static void	InfoCallBack(BMPLIST_WORK* lw,u32 param,u8 y)
{
	if(param == BMPLIST_RABEL){
		BmpListTmpColorChange(lw,FBMP_COL_BLU_SDW,FBMP_COL_BLACK,FBMP_COL_BLUE);
	}else{
		BmpListTmpColorChange(lw,FBMP_COL_WHITE,FBMP_COL_BLACK,FBMP_COL_BLK_SDW);
	}
}

//------------------------------------------------------------------
///	項目リストデータ
//------------------------------------------------------------------
static const BMPLIST_HEADER DebugListHeader = {
	NULL,			//表示文字データポインタ
	NULL,				//カーソル移動ごとのコールバック関数
	InfoCallBack,		//１行ごとのコールバック関数

	NULL,				//GF_BGL_BMPWIN構造体データへのポインタ
	BLIST_NUM,			//リスト項目数
	6,					//表示最大項目数
	2,					//ラベル表示Ｘ座標
	12,					//項目表示Ｘ座標
	1,					//カーソル表示Ｘ座標
	2,					//表示Ｙ座標
	FBMP_COL_WHITE,		//文字色
	FBMP_COL_BLACK,		//背景色
	FBMP_COL_BLK_SDW,	//文字影色
	0,					//文字間隔Ｘ
	1,					//文字間隔Ｙ
	BMPLIST_LRKEY_SKIP,	//ページスキップタイプ
	FONT_SYSTEM,		//文字指定
	0,					//ＢＧカーソル(allow)表示フラグ(0:ON,1:OFF)
	NULL,				//ワークポインタ
};

//プロトタイプ
void DebugMiyukiInit(void* fsys);
static void DebugMiyukiEnd(TCB_PTR tcb,void* work);

/**
 *	@brief	リスト初期化
 */
void DebugMiyukiViewInit(_DEBUG_IWA_WORK* wp,void* fsys,u8 list,u8 cursor)
{
	int i;

	const MENU_PARAM* menuParam = MiyukiMenuList;
	int	size = NELEMS(MiyukiMenuList);
	wp->fsys =fsys;

	//BMPウィンドウ初期化(FieldSysの初期化データを取得)
	wp->pBglIni = FieldBglIniGet(fsys);

	//ウィンドウキャラクタセット
	FieldBitMapWinCgxSet(wp->pBglIni);

	GF_BGL_ScrFill(wp->pBglIni,GF_BGL_FRAME3_M,0x0000,0,0,32,32,GF_BGL_SCRWRT_PALIN);
	GF_BGL_LoadScreenV_Req(wp->pBglIni,GF_BGL_FRAME3_M);

	//クリア
	memset(&(wp->bmpwin),0,sizeof(GF_BGL_BMPWIN));
	wp->List = list;

	//BMPMAPメニュー追加
	wp->menulist = BMP_MENULIST_Create(size,HEAPID_BASE_DEBUG);
	GF_BGL_BmpWinAddEx(wp->pBglIni,&(wp->bmpwin),d_miyuki_BmpDat);

	if(menuParam != NULL){
		MSGDATA_MANAGER* msgman;

		msgman = MSGMAN_Create(MSGMAN_TYPE_NORMAL,ARC_MSG,
					NARC_msg_debug_miyuki_dat,HEAPID_BASE_DEBUG);

		for(i = 0;i < size;i++){
			BMP_MENULIST_AddArchiveString(wp->menulist,
				msgman, menuParam[i].str_id, menuParam[i].param );
		}
		MSGMAN_Delete(msgman);
	}else{
		STRCODE	tmpbuf[128];
		STRBUF	*mstr = STRBUF_Create(128,HEAPID_BASE_DEBUG);
		for(i = 0;i < size;i++){
			PM_strclear(tmpbuf,EOM_,128);
			STRBUF_Clear(mstr);

			//ゾーン名取得
			if(ASCIIcode2DSuni(0,(u8*)ZoneData_GetZoneName(i+2),tmpbuf)){
				tmpbuf[0] = EOM_;
			}
			STRBUF_SetStringCode(mstr,tmpbuf);
			BMP_MENULIST_AddString(wp->menulist,mstr,i+2);
		}
		STRBUF_Delete(mstr);
	}

	//BMPリスト設定
	memcpy(&(wp->bmplist_h),&DebugListHeader,sizeof(BMPLIST_HEADER));
	wp->Cursor = cursor;
	wp->bmplist_h.win = &(wp->bmpwin);
	wp->bmplist_h.list = wp->menulist;
	wp->bmplist_h.work = (void*)wp->blistWk;
	wp->bmplist_h.count = size;
	wp->blistWk = BmpListSet(&(wp->bmplist_h),wp->List,wp->Cursor,HEAPID_BASE_DEBUG);
}

/**
 *	@brief	リスト解放
 */
void DebugMiyukiViewEnd(_DEBUG_IWA_WORK* wp)
{
	//BMPWIN破棄
	GF_BGL_BmpWinOff(&(wp->bmpwin));	//WindowOFF
	//BMPリストの開放
	BmpListExit(wp->blistWk,&(wp->List),&(wp->Cursor));	//リスト破棄
	BMP_MENULIST_Delete(wp->menulist);	//メニュー文字列破棄
	GF_BGL_BmpWinDel(&(wp->bmpwin));	//BMPWindowDel
}

/**
 *	デバッグシステム初期化
 *
 *	u8	DebugMiyukiInit(void* fsys)
 *
 *	@param	void* FLD_DEB_DATへのポインタ
 *	@return none
 */
void DebugMiyukiStart(void* fsys,int* tcb_end_f)
{
	TCB_PTR	pTcb = NULL;
	_DEBUG_IWA_WORK *wp = NULL;
	GF_BGL_INI *ini = NULL;

	//デバッグシステムメモリ確保
	wp = sys_AllocMemory(HEAPID_BASE_DEBUG,sizeof(_DEBUG_IWA_WORK));
	memset(wp,0,sizeof(_DEBUG_IWA_WORK));
	wp->tcb_end_f = tcb_end_f;

	DebugMiyukiViewInit(wp,fsys,0,1);
	wp->seq = DMSEQ_FADEOUT;

	pTcb = TCB_Add(DebugMiyukiMain,wp,0);
}

//=============================================================================
/**
 *	デバッグシステムキー取得(メインタスク)
 *	void DebugMiyukiMain(u8 id);
 *
 *	@param	tcb	TCB_PTR	タスクブロックポインタ
 *	@param	work	タスクワークポインタ
 *	@return	none
 */
//=============================================================================
void DebugMiyukiMain(TCB_PTR tcb,void* work)
{
	s32	ret_code;
	TCB_FUNC	func;
	_DEBUG_IWA_WORK	*wp;

	wp = (_DEBUG_IWA_WORK*)work;

	ret_code = BmpListMain(wp->blistWk);

	//キー操作判定
	if(sys.trg & PAD_BUTTON_DECIDE){
		switch(ret_code){
		case BMPMENU_NULL:
		case BMPMENU_CANCEL:
			DebugMiyukiEnd(tcb,work);
			return;
		default:
			switch(ret_code){
			case 0:
				return;
			case MENU_EXIT:	//メニュー終了
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_TBOOK_ADD:	//電話帳足す
				DebugSub_TelBookSet(wp,0);
				return;
			case MENU_TBOOK_ADDALL:	//電話帳全部
				DebugSub_TelBookSet(wp,1);
				return;
			case MENU_TBOOK_ADEL:	//電話帳全部消す
				DebugSub_TelBookSet(wp,2);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_TBOOK_TEST:	//予約電話テスト
				PMTelSv_CallReserveSet(SaveData_GetPMTelSave(wp->fsys->savedata),0);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_PIC_ADD:	//しゃしん足す
				DebugSub_PictureSet(wp,0);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_PIC_FULL:	//しゃしん足す
				DebugSub_PictureSet(wp,1);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_PIC_ALLDEL:	//写真全部消す
				DebugSub_PictureSet(wp,2);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_TOUDAI_DEMO:	//灯台デモ効果再生
				DebugMiyukiEnd(tcb,work);
				Debug_AsagiToudaiRecoverDemo(wp->fsys);
				return;
			case MENU_TOWER_RNDSEED:	//タワースクリプト　ランダムの種いきなり同期
				BtlTower_UpdateDayRndSeed(wp->fsys->savedata);
				//EventSet_Script(wp->fsys,SCRID_D31R0201_GIRL2_01,NULL);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_TOWER_FCLEAR:	//タワー wifiルームフラグクリア
				TowerWifiData_ClearRoomDataFlag(
					SaveData_GetTowerWifiData(wp->fsys->savedata));
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_TOWER_GUINNESS:	//ギネスホール　デバッグ　記録一杯
				DebugGNSRank_MakeDmyRankingData(
					SaveData_GetGuinnessData(wp->fsys->savedata));
				return;
			case MENU_TOWER_WIFIDAT:	//wifiタワーダミーアップデートデータ作成
				DebugWifiBTower_DummyDataMake(wp->fsys->savedata);
				return;
			case MENU_TOWER_BPGET1:	//500BPゲット
				TowerScoreData_SetBattlePoint(
					SaveData_GetTowerScoreData(wp->fsys->savedata),500,BTWR_DATA_add);
				return;
			case MENU_TOWER_BPGET2:	//9998BPゲット
				TowerScoreData_SetBattlePoint(
					SaveData_GetTowerScoreData(wp->fsys->savedata),9998,BTWR_DATA_set);
				return;
			case MENU_PG_APP0:	//ポケギア　デフォルト
			case MENU_PG_APP1:	//ポケギア　マップオープン
			case MENU_PG_APP2:	//ポケギア　ラジオオープン
				PGearSv_SetAppOpenFlag(
					SaveData_GetPGearSave(wp->fsys->savedata),ret_code-MENU_PG_APP0);
				return;
			case MENU_PG_MLV0:	//ポケギア　マップレベル
			case MENU_PG_MLV1:
			case MENU_PG_MLV2:
				PGearSv_SetMapOpenLevel(
					SaveData_GetPGearSave(wp->fsys->savedata),ret_code-MENU_PG_MLV0);
				return;
			case MENU_CAPSULE_PC:
			case MENU_CAPSULE_FULL:
			case MENU_CAPSULE_A_LITTLE:
			case MENU_CAPSULE_CLEAR:
				DebugSub_Capsule(work,ret_code-MENU_CAPSULE_PC);
				DebugMiyukiEnd(tcb,work);
				return;
			case MENU_EGG_DEMO_N:
			case MENU_EGG_DEMO_M:
				DebugMiyukiEnd(tcb,work);
				DebugSub_EggDemo(work,ret_code-MENU_EGG_DEMO_N);
				return;
			case MENU_SAFARI_PARAM_M:
			case MENU_SAFARI_PARAM_F:
				DebugSub_SafariParamViewer(tcb,work,ret_code-MENU_SAFARI_PARAM_M);
				return;
			case MENU_JUICE_NULL:
				{
					int i;
					BONGURI_SAVE* bong_sv = SaveData_GetBonguriSave(wp->fsys->savedata);
					for(i = 0;i < BONGJUICE_STOCK_MAX;i++){
						if(BonguriSave_UseJuice(bong_sv) == 0){
							break;
						}
					}
				}
				return;
			case MENU_CJUICE_NULL:
				BonguriSave_CommJuiceAllClear(SaveData_GetBonguriSave(wp->fsys->savedata));
				return;
			case MENU_TRHOUSE_CLEAR:
				TrHouseSave_Clear(SaveData_GetTrHouseSave(wp->fsys->savedata));
				Snd_SePlay(SEQ_SE_DP_DECIDE);
				return;
			default:
				//関数ポインタ保存
				wp->UserFunc = (void*)ret_code;
				TCB_ChangeFunc(tcb,DebugMiyukiFuncCall);
				wp->func_mode = DM_FMODE_DEFAULT;

				if(	ret_code == (u32)DebugSub_PGearNormalInit ||
					ret_code == (u32)DebugSub_PGearTelInit ||
					ret_code == (u32)DebugSub_TMapJumpInit ||
					ret_code == (u32)DebugSub_TMapBGInit){
					wp->func_mode = DM_FMODE_PGEAR;
				}
			}
			return;
		}
		return;
	}
	//メニューキャンセル
	if(sys.trg & PAD_BUTTON_B){
		DebugMiyukiEnd(tcb,work);
		return;
	}
}

/**
 *	@brief	デバッグメニューの終了処理
 *
 *	デバッグメニュー用ワークとリストの破棄を行う
 *	@param	tcb		TCB_PTR:呼び出し元タスクブロックへのポインタ
 *	@param	work	void*:呼び出し元タスクブロックワークへのポインタ
 */
static void DebugMiyukiEnd(TCB_PTR tcb,void* work)
{
	_DEBUG_IWA_WORK	*wp = (_DEBUG_IWA_WORK*)work;

	DebugMiyukiViewEnd(wp);

	*(wp->tcb_end_f) = TRUE;

	//デバッグワークメモリ開放
	sys_FreeMemoryEz(work);
	TCB_Delete(tcb);

	//OBJ等の動作停止解除
	FieldSystemProc_SeqHoldEnd();
	return;
}

/**
 *	@brief	デバッグメニューを閉じる
 */
static void DebugMenuExit(TCB_PTR tcb,void* work)
{
	DebugMiyukiEnd(tcb,work);
}

/**
 *	@brief	デバッグメニュー　ポケギア呼び出し
 */
static void* DebugPokeGearCall(FIELDSYS_WORK* fsys,u8 mode)
{
	PGEAR_PARAM * pp;

	switch(mode){
	case PGSKY_CALL_JUMP:
	case PGSKY_CALL_BG:
		pp = FieldPGearSky_SetProc(fsys ,mode);
		break;
	default:
		pp = FieldPokeGear_SetProc(fsys );
	}
	return pp;
}
/**
 *	@brief	デバッグメニュー　ポケギア呼び出しシーケンス初期化
 */
static void DebugSub_PGearNormalInit(void* work)
{
	_DEBUG_IWA_WORK	*wp = (_DEBUG_IWA_WORK*)work;

	wp->subWork = DebugPokeGearCall(wp->fsys,0xff);
}

/**
 *	@brief	デバッグメニュー　ポケギア 電話着信モード呼び出しシーケンス初期化
 */
static void DebugSub_PGearTelInit(void* work)
{
	_DEBUG_IWA_WORK	*wp = (_DEBUG_IWA_WORK*)work;

	FldPMTel_CallupFlagSet(FldPMTel_PointerGet(wp->fsys));
	wp->subWork = DebugPokeGearCall(wp->fsys,0xff);
}
/**
 *	@brief	デバッグメニュー　タウンマップ呼び出しシーケンス初期化
 */
static void DebugSub_TMapJumpInit(void* work)
{
	_DEBUG_IWA_WORK	*wp = (_DEBUG_IWA_WORK*)work;

	wp->subWork = DebugPokeGearCall(wp->fsys,PGSKY_CALL_JUMP);
}
/**
 *	@brief	デバッグメニュー　タウンマップ呼び出しシーケンス初期化
 */
static void DebugSub_TMapBGInit(void* work)
{
	_DEBUG_IWA_WORK	*wp = (_DEBUG_IWA_WORK*)work;

	wp->subWork = DebugPokeGearCall(wp->fsys,PGSKY_CALL_BG);
}

/**
 *	@brief	デバッグメニュー　サファリレイアウト呼び出し
 */
static void DebugSub_SafariLayout(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldSafariLayout_SetProc(wp->fsys);
}
/**
 *	@brief	デバッグメニュー　サファリOBJレイアウト呼び出し
 */
static void DebugSub_SafariObjLayout(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldSafariObjLayout_SetProc(wp->fsys);
}

/**
 *	@brief	デバッグメニュー　サファリパラメータViewer
 */
static void DebugSub_SafariParamViewer(TCB_PTR tcb,void* work,u8 mode)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	D_SAF_PARAM* sp;
	MSGDATA_MANAGER* msgman;

	wp->seq = 0;
	wp->subWork = sys_AllocMemoryLo(HEAPID_BASE_DEBUG,sizeof(D_SAF_PARAM));
	MI_CpuClear8(wp->subWork,sizeof(D_SAF_PARAM));

	sp = (D_SAF_PARAM*)wp->subWork;
	sp->pl = SafariSv_GetLayoutPointer(SaveData_GetSafariSave(wp->fsys->savedata),mode);

	sp->wset = WORDSET_CreateEx(WORDSET_DIWA_BUFNUM,WORDSET_DIWA_BUFLEN,HEAPID_BASE_DEBUG);

	msgman = MSGMAN_Create(MSGMAN_TYPE_NORMAL,ARC_MSG,
					NARC_msg_debug_miyuki_dat,HEAPID_BASE_DEBUG);
	sp->str = MSGMAN_AllocString(msgman,msg_safari_param);
	sp->s_tmp = STRBUF_Create(256,HEAPID_BASE_DEBUG);
	MSGMAN_Delete(msgman);

	TCB_ChangeFunc(tcb,SafariParamViewer);
}


/**
 *	@brief	デバッグメニュー　冒険ノート呼び出し
 */
static void DebugSub_FNote(void* work)
{
#if 0
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldFantasyNote_SetProc(wp->fsys,HEAPID_WORLD);
#endif
}

/**
 *	@brief	デバッグメニュー　イメージクリップノーマル呼び出し
 */
static void DebugSub_IClipNrm(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = DebugImageClip_SetProc(wp->fsys,(BOOL*)&wp->ret_val,0);
}

/**
 *	@brief	デバッグメニュー　イメージクリップ初回呼び出し
 */
static void DebugSub_IClip1st(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = DebugImageClip_SetProc(wp->fsys,(BOOL*)&wp->ret_val,1);
}

/**
 *	@brief	デバッグメニュー　ともだち手帳呼び出し
 */
static void DebugSub_WifiNote(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = WifiNote_SetProc(wp->fsys,wp->fsys->savedata,HEAPID_WORLD);
}

/**
 *	@brief	デバッグメニュー　レコードコーナー
 */
static void DebugSub_Record(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = RecordCorner_SetProc(wp->fsys);
}

/**
 *	@brief	デバッグメニュー　木の実プランター
 */
static void DebugSub_NPlanter(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldNutPlanter_SetProc(wp->fsys);
}

/**
 *	@brief	ボングリケース呼び出し
 */
static void dsub_BongCaseCall(_DEBUG_IWA_WORK* wp,u8 mode)
{
	if(mode == 0){	//ノーマル
		wp->subWork = FieldBongCase_SetProc(wp->fsys,BONGCASE_NORMAL);
	}else if(mode == 1){	//ボール
		wp->subWork = FieldBongCase_SetProc(wp->fsys,BONGCASE_BALL);
	}else{
		wp->subWork = FieldBongCase_SetProc(wp->fsys,BONGCASE_DEBPOT);
	}
	if(mode == 3){
		BONGCASE_PARAM* prm;
		prm = (BONGCASE_PARAM* )wp->subWork;
		prm->pot_call_ini_f = TRUE;	//無理やり初回呼び出しモード
	}
}
/**
 *	@brief	デバッグメニュー　ぼんぐりケース
 */
static void DebugSub_BongCaseNormal(void* work)
{
	dsub_BongCaseCall((_DEBUG_IWA_WORK*)work,0);
}
static void DebugSub_BongCaseBall(void* work)
{
	dsub_BongCaseCall((_DEBUG_IWA_WORK*)work,1);
}
static void DebugSub_BongCasePot(void* work)
{
	dsub_BongCaseCall((_DEBUG_IWA_WORK*)work,2);
}
static void DebugSub_BongCasePot1st(void* work)
{
	dsub_BongCaseCall((_DEBUG_IWA_WORK*)work,3);
}
static void DebugSub_BonguriMax(void* work)
{
	int i;
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	BONGURI_SAVE* bong = SaveData_GetBonguriSave(wp->fsys->savedata);
	for(i = 0;i < BONG_COL_MAX;i++){
		BonguriSave_BonguriAdd(bong,i,BONGURI_KEEP_MAX);
	}
}
static void DebugSub_BonguriNull(void* work)
{
	int i;
	u8	num;
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	BONGURI_SAVE* bong = SaveData_GetBonguriSave(wp->fsys->savedata);
	for(i = 0;i < BONG_COL_MAX;i++){
		num = BonguriSave_GetBonguriNum(bong,i);
		BonguriSave_BonguriSub(bong,i,num);
	}
}

/**
 *	@brief	デバッグメニュー　アンノーンパズル Lv01
 */
static void DebugSub_AnPuzzleLv01(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldAnPuzzle_SetProc(wp->fsys,0);
}
static void DebugSub_AnPuzzleLv02(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldAnPuzzle_SetProc(wp->fsys,1);
}
static void DebugSub_AnPuzzleLv03(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldAnPuzzle_SetProc(wp->fsys,2);
}
static void DebugSub_AnPuzzleLv04(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldAnPuzzle_SetProc(wp->fsys,3);
}
static void DebugSub_AnNote(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldAnNote_SetProc(wp->fsys);
}

/**
 *	@brief	デバッグメニュー　スロット呼び出し
 */
static void DebugSub_SlotHard0(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldSlot_SetProc(wp->fsys,SLOT_HARD_0);
}
static void DebugSub_SlotHard1(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldSlot_SetProc(wp->fsys,SLOT_HARD_1);
}
static void DebugSub_SlotHard2(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldSlot_SetProc(wp->fsys,SLOT_HARD_2);
}
static void DebugSub_SlotHard3(void* work)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	wp->subWork = FieldSlot_SetProc(wp->fsys,SLOT_HARD_3);
}

//カスタムボールアプリ呼び出し
static void DebugSub_Capsule(void* work,int code)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;

	switch(code){
	case 1:
		Debug_CB_SaveData_Sample(CB_SaveData_AllDataGet(wp->fsys->savedata), DEBUG_CB_MODE_ITEM_FULL);
		break;
	case 2:
		Debug_CB_SaveData_Sample(CB_SaveData_AllDataGet(wp->fsys->savedata), DEBUG_CB_MODE_ITEM_A_LITTLE);
		break;
	case 3:
		Debug_CB_SaveData_Sample(CB_SaveData_AllDataGet(wp->fsys->savedata), DEBUG_CB_MODE_CLEAR);
		break;
	}
	CustomBallEdit_Start(wp->fsys);
}

//たまごうまれデモ
static void DebugSub_EggDemo(void* work,int code)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;

	if(code == 0){
		DebugEGG_DemoStart(wp->fsys);
	}else{
		DebugEGG_DemoStartMana(wp->fsys);
	}
}

/**
 *	@brief	デバッグメニュー　電話帳データセット
 */
static void DebugSub_TelBookSet(void* work,int mode)
{
	int i;
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	PGEAR_SAVE* pg_save;

	pg_save = SaveData_GetPGearSave(GameSystem_GetSaveData(wp->fsys));

	switch(mode){
	case 0:
		for(i = 0;i < PMTEL_NUMBER_MAX;i++){
			if(PGearSv_IsTelNumberEntry(pg_save,i) == PMTEL_NUMBER_NULL){
				Snd_SePlay(SEQ_SE_DP_DECIDE);
				PGearSv_AddTelNumber(pg_save,i);
				break;
			}
		}
		break;
	case 1:
		for(i = 0;i < PMTEL_NUMBER_MAX;i++){
			PGearSv_AddTelNumber(pg_save,i);
		}
		Snd_SePlay(SEQ_SE_DP_DECIDE);
		break;
	case 2:
		PGearSv_TelBookAllClear(pg_save);
		Snd_SePlay(SEQ_SE_DP_DECIDE);
		break;
	}
}

//写真デバッグ作成用データ配列
static const u16 DPictData[36][3] = {
 {ZONE_ID_T20,688,394},{ZONE_ID_T20,697,397},{ZONE_ID_R27,742,397},{ZONE_ID_R27,745,406},
 {ZONE_ID_T21,573,397},{ZONE_ID_T21,557,403},{ZONE_ID_T21,539,406},{ZONE_ID_T21,527,406},
 {ZONE_ID_R30,566,296},{ZONE_ID_R30,558,358},{ZONE_ID_R31,563,272},{ZONE_ID_R31,542,271},
 {ZONE_ID_T22,497,273},{ZONE_ID_T22,487,279},{ZONE_ID_T22,487,235},{ZONE_ID_T22,493,258},
 {ZONE_ID_R32,470,381},{ZONE_ID_R32,464,432},{ZONE_ID_T23,434,459},{ZONE_ID_T23,401,456},
 {ZONE_ID_T23,419,470},{ZONE_ID_R34,359,386},{ZONE_ID_R34,358,411},{ZONE_ID_T25,316,362},
 {ZONE_ID_T25,357,350},{ZONE_ID_T25,362,371},{ZONE_ID_T25,273,335},{ZONE_ID_T25,321,350},
 {ZONE_ID_R35,366,303},{ZONE_ID_R33,464,464},{ZONE_ID_T21,550,401},{ZONE_ID_T25,337,365},
 {ZONE_ID_T27,395,159},{ZONE_ID_T27,392,174},{ZONE_ID_T27,392,190},{ZONE_ID_T27,378,152},
};

/**
 *	@brief	デバッグメニュー　写真データセット
 */
static void DebugSub_PictureSet(void* work,int mode)
{
	_DEBUG_IWA_WORK *wp  = (_DEBUG_IWA_WORK*)work;
	PICTURE_SAVE* pic_save;
	PICTURE_DATA	pict;
	PICTURE_ID	idx,i;
	pic_save = SaveData_GetPictureSave(GameSystem_GetSaveData(wp->fsys));

	switch(mode){
	case 0:
		idx = PictureSave_SearchNullID(pic_save);
		if(idx == PICTURE_ID_NULL){
			OS_Printf("写真追加失敗<-空きがありません\n");
		}else{
			FldPicture_MakeData(&pict,wp->fsys,gf_mtRand()%10,
				wp->fsys->location->zone_id,
				(const int)Player_NowGPosXGet( wp->fsys->player ) ,(const int)Player_NowGPosZGet( wp->fsys->player ),
				0,0,0xff,0);

			PictureSave_SetPictureDataSingle(pic_save,(const PICTURE_DATA*)&pict,idx);
			OS_Printf("写真追加<-id = %d\n",idx);
		}
		break;
	case 1:
		idx = PictureSave_SearchNullID(pic_save);
		if(idx == PICTURE_ID_NULL){
			OS_Printf("写真追加失敗<-空きがありません\n");
			return;
		}
		for(i = idx;i < PICTURE_DATA_MAX;i++){
			FldPicture_MakeData(&pict,wp->fsys,gf_mtRand()%10,
				DPictData[i][0],DPictData[i][1],DPictData[i][2],
				0,0,0xff,0);

			PictureSave_SetPictureDataSingle(pic_save,(const PICTURE_DATA*)&pict,i);
			OS_Printf("写真追加<-id = %d\n",i);
		}
		break;
	default:
		PictureSv_Init((void*)pic_save);
		OS_Printf("写真データ全削除\n");
	}
}

static void SafariParamViewer(TCB_PTR tcb,void* work)
{
	_DEBUG_IWA_WORK	*wp = (_DEBUG_IWA_WORK*)work;
	D_SAF_PARAM* sp = (D_SAF_PARAM*)wp->subWork;

	switch(wp->seq){
	case 0:
		DebugMiyukiViewEnd(wp);
		GF_BGL_BmpWinAddEx(wp->pBglIni,&(wp->bmpwin),&d_miyuki_BmpDat[1]);
		GF_BGL_BmpWinDataFill(&wp->bmpwin,FBMP_COL_WHITE);

		{
			int i,j;
			SAFARI_BLOCK_LEVEL sbl;

			for(i = 0;i < 6;i++){
				WORDSET_RegisterNumber( sp->wset, 0,
					sp->pl->block[i].map_id , 2, NUMBER_DISPTYPE_ZERO, NUMBER_CODETYPE_HANKAKU );
				WORDSET_RegisterNumber( sp->wset, 1,
					sp->pl->map_level[sp->pl->block[i].map_id]/10, 2, NUMBER_DISPTYPE_ZERO, NUMBER_CODETYPE_HANKAKU );

				SafariData_GetBlockAttrLevel(sp->pl,i,&sbl);
				for(j = 0;j < (SAFARI_ATTR_MAX-1);j++){
					WORDSET_RegisterNumber( sp->wset, 2+(j*2)+0,
						sbl.obj_num[j], 2, NUMBER_DISPTYPE_LEFT, NUMBER_CODETYPE_HANKAKU );
					WORDSET_RegisterNumber( sp->wset, 2+(j*2)+1,
						sbl.level[j], 3, NUMBER_DISPTYPE_LEFT, NUMBER_CODETYPE_HANKAKU );
				}
				WORDSET_ExpandStr( sp->wset, sp->s_tmp ,sp->str);
				GF_STR_PrintColor( &wp->bmpwin, FONT_SYSTEM, sp->s_tmp,
					4,i*32, MSG_NO_PUT, GF_PRINTCOLOR_MAKE(FBMP_COL_BLACK,FBMP_COL_BLK_SDW,FBMP_COL_WHITE), NULL );
			}
		}
		GF_BGL_BmpWinOn(&wp->bmpwin);
		break;
	case 1:
		if(!(sys.trg & (PAD_BUTTON_A|PAD_BUTTON_B))){
			return;
		}
		break;
	default:
		GF_BGL_BmpWinOff(&wp->bmpwin);
		GF_BGL_BmpWinDel(&wp->bmpwin);

		STRBUF_Delete(sp->s_tmp);
		STRBUF_Delete(sp->str);
		WORDSET_Delete(sp->wset);
		sys_FreeMemoryEz(sp);
		wp->subWork = NULL;

		DebugMiyukiViewInit(wp,wp->fsys,wp->List,wp->Cursor);
		wp->seq = 0;
		TCB_ChangeFunc(tcb,DebugMiyukiMain);
		return;
	}
	wp->seq++;
}


#endif	//PM_DEBUG